namespace OneAuthCenter.Client.Options;

/// <summary>
/// OneAuthCenter 客户端配置选项
/// </summary>
/// <remarks>
/// 用于配置第三方应用如何连接和认证 OneAuthCenter
/// 
/// 使用方式：
/// <code>
/// services.AddOneAuthCenter(options =>
/// {
///     options.Authority = "https://auth.yourdomain.com";
///     options.Audience = "your-api";
///     options.RequireHttpsMetadata = true;
/// });
/// </code>
/// </remarks>
public class OneAuthCenterOptions
{
    /// <summary>
    /// 认证中心地址（必填）
    /// </summary>
    /// <example>https://auth.yourdomain.com</example>
    public string Authority { get; set; } = string.Empty;
    
    /// <summary>
    /// API 资源标识符（受众）
    /// </summary>
    /// <remarks>
    /// 用于验证 Token 的 audience (aud) 声明
    /// 如果不设置，则不验证 audience
    /// </remarks>
    /// <example>orders-api</example>
    public string? Audience { get; set; }
    
    /// <summary>
    /// 是否要求 HTTPS 元数据（生产环境建议 true）
    /// </summary>
    public bool RequireHttpsMetadata { get; set; } = true;
    
    /// <summary>
    /// 是否保存 Token 到 AuthenticationProperties
    /// </summary>
    public bool SaveToken { get; set; } = true;
    
    /// <summary>
    /// Token 验证参数配置
    /// </summary>
    public TokenValidationOptions TokenValidation { get; set; } = new();
    
    /// <summary>
    /// JWKS 缓存时间（秒）
    /// </summary>
    /// <remarks>
    /// 定期从认证中心刷新公钥
    /// 默认 3600 秒（1 小时）
    /// </remarks>
    public int JwksRefreshInterval { get; set; } = 3600;
    
    /// <summary>
    /// HTTP 客户端超时时间（秒）
    /// </summary>
    public int HttpClientTimeout { get; set; } = 30;
}

/// <summary>
/// Token 验证参数配置
/// </summary>
public class TokenValidationOptions
{
    /// <summary>
    /// 是否验证签发者 (issuer)
    /// </summary>
    public bool ValidateIssuer { get; set; } = true;
    
    /// <summary>
    /// 是否验证受众 (audience)
    /// </summary>
    public bool ValidateAudience { get; set; } = true;
    
    /// <summary>
    /// 是否验证生命周期 (lifetime)
    /// </summary>
    public bool ValidateLifetime { get; set; } = true;
    
    /// <summary>
    /// 是否验证签名密钥
    /// </summary>
    public bool ValidateIssuerSigningKey { get; set; } = true;
    
    /// <summary>
    /// 时钟偏差容忍时间（秒）
    /// </summary>
    /// <remarks>
    /// 用于处理服务器时间不同步的情况
    /// 0 表示不容忍任何偏差
    /// </remarks>
    public int ClockSkew { get; set; } = 0;
    
    /// <summary>
    /// 必需的 Scopes（可选）
    /// </summary>
    /// <remarks>
    /// 如果设置，Token 必须包含所有指定的 scopes
    /// 例如: new[] { "orders.read", "orders.create" }
    /// </remarks>
    public string[]? RequiredScopes { get; set; }
}

